package limitedStateMachine;

/**
 * tcp有限状态机器 FSM
 * 状态之间怎么迁移和变化的
 * 线程的状态迁移图
 * new 状态处于new
 * 当执行start() 会被系统调度器拿去执行处于就绪状态。 在就绪队列中。
 * cpu 调度器拿来执行 running状态 thread yield 又会进入到 就绪态。 执行一段时间被挂起 也会回到就绪态
 * 阻塞
 * ==========================
 * 消耗cpu 需要记时间
 * sleep(time)
 * wait(time)
 * join(time)
 * LockSupport.parkxxx()
 * 进入TimeWaiting
 * 等待时间完成回到就绪状态
 * ===========================
 *
 * ===========================
 * wait()
 * join()
 * LockSupport.park()
 * 没有制定时间就无限等待
 * Waiting 什么时候调用notify | notifyAll 才会回到就绪态
 * ============================
 *
 * ============================
 * Block是不消耗cpu的
 * 执行的时候进入sync的代码块 锁释放才进入到就绪态
 * ============================
 */

/**
 * Action
 * 动作
 */
class Action{
    String str;
}

/**
 * 线程状态
 */
abstract class ThreadState_{
    abstract void move(Action input);
    abstract void run();
}

/**
 * 线程执行
 */
class Thread_{
    public ThreadState_ threadState_;

    void move(Action input){
        threadState_.move(input);
    }

    void start(){
        System.out.println("starting");
        // 创建状态
        threadState_ = new NewState(this);
        Action action = new Action();
        action.str = "start";
        move(action);
    }
}


/**
 * new State
 */
class NewState extends ThreadState_{
    private Thread_ thread_;

    public NewState(Thread_ thread_){
        this.thread_ = thread_;
    }

    @Override
    void move(Action input) {
        // 如果线程创建了开始进行状态迁移
        if("start" == input.str){
            thread_.threadState_ = new Running(thread_);
        }

        run();
    }

    @Override
    void run() {
        System.out.println("线程创建");

        // 状态开始迁移
        Action action = new Action();
        action.str = "ready";
        thread_.threadState_.move(action);
    }
}

/**
 * running state
 */
class Running extends ThreadState_{

    private Thread_ thread_;

    public Running(Thread_ thread_){
        this.thread_ = thread_;
    }

    @Override
    void move(Action input) {
        System.out.println("迁移到了running");
    }

    @Override
    void run() {

    }
}

public class LimitedStateMachine {
    public static void main(String[] args) {
        System.out.println("有限状态机 ");

        Thread_ thread_ = new Thread_();
        thread_.start();
    }
}
